#pragma once
#include "OnvifHead.h"
#include <iostream>
#include <exception>
#include "OnvifHead.h"
#include <iostream>
#include <exception>

using namespace std;
namespace onvif {

	struct VideoFormat{
		string encodec_str {};

		int frame_rate {};
		int bit_rate {};
		int keyframe_interval {};
	};

	class ipcamera
	{
	public:
		ipcamera(const string &camera_ip, const string &onvif_user, const string &onvif_passwd, int stream_type);
		~ipcamera();

//		获取错误描述
		string GetErrorInfo() const;
//		获取设备能力
		bool CheckDevice();
//		获取RTSP流地址
		string GetRTSPString();
//		获取视频流信息
		bool GetVideoFormat(VideoFormat &video_encoder);
//		更新设备时间
		bool UpdateDeviceDatetime();
// 		获取设备时间
		string GetDeviceDatetime();

	private:
		bool Authenticate();
		void init_error();
		
	private:
		string camera_ip_m;
		// 相机权鉴功能的用户名和密码
		string onvif_user_m;
		string onvif_passwd_m;

		int stream_type_m;

		// onvif协议下与相机通信描述弗
		soap *soap_m;

		// 设备媒体能力地址，用于获取相机媒体相关参数
		string media_url_m;
		// 设备信息能力地址
		string device_url_m;

		string _error_info {};
	};


	class VideoRecordException: public exception {
	public:
		explicit VideoRecordException(string &error_message):error_message_m(error_message){}
		~VideoRecordException() = default;
		
		virtual const char *what(){ return error_message_m.data(); }
	private:
		std::string error_message_m;
	};
}
